import win32gui, win32con, win32api, time, os, glob
## some of these tests will fail for systems prior to XP

for pname in(
    ## Set actions all take an unsigned int in pvParam
    "SPI_GETMOUSESPEED", "SPI_GETACTIVEWNDTRKTIMEOUT", "SPI_GETCARETWIDTH",
    "SPI_GETFOREGROUNDFLASHCOUNT", "SPI_GETFOREGROUNDLOCKTIMEOUT", 
    ## Set actions all take an unsigned int in uiParam
    "SPI_GETWHEELSCROLLLINES", "SPI_GETKEYBOARDDELAY",
    "SPI_GETKEYBOARDSPEED",
    "SPI_GETMOUSEHOVERHEIGHT", "SPI_GETMOUSEHOVERWIDTH",
    "SPI_GETMOUSEHOVERTIME", "SPI_GETSCREENSAVETIMEOUT", "SPI_GETMENUSHOWDELAY",
    "SPI_GETLOWPOWERTIMEOUT", "SPI_GETPOWEROFFTIMEOUT",  "SPI_GETBORDER",
    ## below are winxp only:
    "SPI_GETFONTSMOOTHINGCONTRAST", "SPI_GETFONTSMOOTHINGTYPE", "SPI_GETFOCUSBORDERHEIGHT",
    "SPI_GETFOCUSBORDERWIDTH",      "SPI_GETMOUSECLICKLOCKTIME"):
    print pname
    cget=getattr(win32con,pname)
    cset=getattr(win32con,pname.replace('_GET','_SET'))
    orig_value=win32gui.SystemParametersInfo(cget)
    print '\toriginal setting:',orig_value
    win32gui.SystemParametersInfo(cset, orig_value+1)
    new_value=win32gui.SystemParametersInfo(cget)
    print '\tnew value:',new_value
    # On Vista, some of these values seem to be ignored.  So only "fail" if
    # the new value isn't what we set or the original
    if new_value!=orig_value+1:
        assert new_value == orig_value
        print "Strange - setting %s seems to have been ignored" % (pname,)
    win32gui.SystemParametersInfo(cset, orig_value)
    assert win32gui.SystemParametersInfo(cget)==orig_value



# these take a boolean value in pvParam
# change to opposite, check that it was changed and change back
for pname in ("SPI_GETFLATMENU","SPI_GETDROPSHADOW","SPI_GETKEYBOARDCUES","SPI_GETMENUFADE",
    "SPI_GETCOMBOBOXANIMATION", "SPI_GETCURSORSHADOW", "SPI_GETGRADIENTCAPTIONS", "SPI_GETHOTTRACKING",
    "SPI_GETLISTBOXSMOOTHSCROLLING", "SPI_GETMENUANIMATION", "SPI_GETSELECTIONFADE",
    "SPI_GETTOOLTIPANIMATION", "SPI_GETTOOLTIPFADE", "SPI_GETUIEFFECTS", "SPI_GETACTIVEWINDOWTRACKING",
    "SPI_GETACTIVEWNDTRKZORDER"):
    print pname
    cget=getattr(win32con,pname)
    cset=getattr(win32con,pname.replace('_GET','_SET'))
    orig_value=win32gui.SystemParametersInfo(cget)
    print orig_value
    win32gui.SystemParametersInfo(cset, not orig_value)
    new_value=win32gui.SystemParametersInfo(cget)
    print new_value
    assert orig_value!=new_value
    win32gui.SystemParametersInfo(cset, orig_value)
    assert win32gui.SystemParametersInfo(cget)==orig_value



# these take a boolean in uiParam
#  could combine with above section now that SystemParametersInfo only takes a single parameter
for pname in ("SPI_GETFONTSMOOTHING","SPI_GETICONTITLEWRAP","SPI_GETBEEP","SPI_GETBLOCKSENDINPUTRESETS",
    "SPI_GETKEYBOARDPREF","SPI_GETSCREENSAVEACTIVE","SPI_GETMENUDROPALIGNMENT",
    "SPI_GETDRAGFULLWINDOWS", "SPI_GETSHOWIMEUI"):
    cget=getattr(win32con,pname)
    cset=getattr(win32con,pname.replace('_GET','_SET'))
    orig_value=win32gui.SystemParametersInfo(cget)
    win32gui.SystemParametersInfo(cset, not orig_value)
    new_value=win32gui.SystemParametersInfo(cget)
    # Some of these also can't be changed (eg, SPI_GETSCREENSAVEACTIVE) so
    # don't actually get upset.
    if orig_value!=new_value:
        print "successfully toggled", pname, "from", orig_value, "to", new_value
    else:
        print "couldn't toggle", pname, "from", orig_value
    win32gui.SystemParametersInfo(cset, orig_value)
    assert win32gui.SystemParametersInfo(cget)==orig_value



print "SPI_GETICONTITLELOGFONT"
lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT)
orig_height=lf.lfHeight
orig_italic=lf.lfItalic
print 'Height:', orig_height, 'Italic:',orig_italic
lf.lfHeight+=2
lf.lfItalic=not lf.lfItalic
win32gui.SystemParametersInfo(win32con.SPI_SETICONTITLELOGFONT, lf)
new_lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT)
print 'New Height:', new_lf.lfHeight, 'New Italic:',new_lf.lfItalic
assert new_lf.lfHeight==orig_height+2
assert new_lf.lfItalic!=orig_italic

lf.lfHeight=orig_height
lf.lfItalic=orig_italic
win32gui.SystemParametersInfo(win32con.SPI_SETICONTITLELOGFONT, lf)
new_lf=win32gui.SystemParametersInfo(win32con.SPI_GETICONTITLELOGFONT)
assert new_lf.lfHeight==orig_height
assert new_lf.lfItalic==orig_italic



print "SPI_GETMOUSEHOVERWIDTH, SPI_GETMOUSEHOVERHEIGHT, SPI_GETMOUSEHOVERTIME"
w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH)
h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT)
t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME)
print 'w,h,t:', w,h,t

win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERWIDTH,w+1)
win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERHEIGHT,h+2)
win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERTIME,t+3)
new_w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH)
new_h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT)
new_t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME)
print 'new w,h,t:', new_w, new_h, new_t
assert new_w==w+1
assert new_h==h+2
assert new_t==t+3

win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERWIDTH,w)
win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERHEIGHT,h)
win32gui.SystemParametersInfo(win32con.SPI_SETMOUSEHOVERTIME,t)
new_w=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERWIDTH)
new_h=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERHEIGHT)
new_t=win32gui.SystemParametersInfo(win32con.SPI_GETMOUSEHOVERTIME)
assert new_w==w
assert new_h==h
assert new_t==t



print "SPI_SETDOUBLECLKWIDTH, SPI_SETDOUBLECLKHEIGHT"
x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK)
y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK)
print 'x,y:', x, y
win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKWIDTH, x+1)
win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKHEIGHT, y+2)
new_x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK)
new_y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK)
print 'new x,y:', new_x, new_y
assert new_x==x+1
assert new_y==y+2
win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKWIDTH, x)
win32gui.SystemParametersInfo(win32con.SPI_SETDOUBLECLKHEIGHT, y)
new_x=win32api.GetSystemMetrics(win32con.SM_CXDOUBLECLK)
new_y=win32api.GetSystemMetrics(win32con.SM_CYDOUBLECLK)
assert new_x==x
assert new_y==y



print "SPI_SETDRAGWIDTH, SPI_SETDRAGHEIGHT"
dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG)
dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG)
print 'dw,dh:', dw, dh
win32gui.SystemParametersInfo(win32con.SPI_SETDRAGWIDTH,dw+1)
win32gui.SystemParametersInfo(win32con.SPI_SETDRAGHEIGHT,dh+2)
new_dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG)
new_dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG)
print 'new dw,dh:', new_dw, new_dh
assert new_dw==dw+1
assert new_dh==dh+2
win32gui.SystemParametersInfo(win32con.SPI_SETDRAGWIDTH,dw)
win32gui.SystemParametersInfo(win32con.SPI_SETDRAGHEIGHT,dh)
new_dw=win32api.GetSystemMetrics(win32con.SM_CXDRAG)
new_dh=win32api.GetSystemMetrics(win32con.SM_CYDRAG)
assert new_dw==dw
assert new_dh==dh



orig_wallpaper=win32gui.SystemParametersInfo(Action=win32con.SPI_GETDESKWALLPAPER)
print 'Original: ',orig_wallpaper
for bmp in glob.glob(os.path.join(os.environ['windir'],'*.bmp')):
    print bmp
    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, Param=bmp)
    print win32gui.SystemParametersInfo(Action=win32con.SPI_GETDESKWALLPAPER)
    time.sleep(1)

win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, Param=orig_wallpaper)




